/*
 * Cangrejo.cpp
 *
 *  Created on: 01/10/2013
 *      Author: ezequiel
 */

#include "Cangrejo.h"

Cangrejo::Cangrejo(glm::vec3 posicion, glm::vec3 tamano, glm::vec3 direccion, float angulo) : Dibujable() {

	this->cuerpo = new CuerpoCangrejo(4.0f); //harcodeo
	this->camara = NULL ;
	piernas = (Pierna**)malloc(sizeof(Pierna*)*6);
	this->posicionCangrejo = posicion;
	this->tamanoCangrejo = tamano;
	this->direccionCangrejo = direccion;


	for (int i = 0 ; i < 6 ; i++)
	piernas[i] = new Pierna();

	/// piernas del lado derecho, de adelante hacia atras ///

	for (int j = 0 ; j < 3 ; j++){
		this->apartamientoPierna[j] = 35;

		this->apartamientoPiernasRespectoCuerpo[j] = 90;	//este valor va a ser siempre el mismo
		this->direccionAngularPierna[j].x = 0;
		this->direccionAngularPierna[j].y = -1 + j;
		this->direccionAngularPierna[j].z = 0;
		this->traslacionPiernaRespectoCuerpo[j].x = (1-j) * (-1.5);
		this->traslacionPiernaRespectoCuerpo[j].y = -2.0;	//este valor va a ser siempre el mismo
		this->traslacionPiernaRespectoCuerpo[j].z = 1.0;	//este valor va a ser siempre el mismo
	}
	this->direccionAngularPierna[1].y = 1;
	this->apartamientoPierna[1]= 360;	//no queda otra
	this->piernas[0]->setAnguloInicial(350, false);
	this->piernas[2]->setAnguloInicial(350, false);
	this->piernas[1]->setAnguloInicial(380, true);
	this->piernas[3]->setAnguloInicial(350, false);
	this->piernas[5]->setAnguloInicial(350, false);
	this->piernas[4]->setAnguloInicial(380, true);
	/// piernas del lado izquierdo , de adelante hacia atras ///

	for (int k = 3;  k < 6 ; k++)
	{
		this->apartamientoPiernasRespectoCuerpo[k] = 180;
		this->apartamientoPierna[k] = 35;
		this->traslacionPiernaRespectoCuerpo[k].x = -1.5 - (3-k) * 1.5 ;
		this->traslacionPiernaRespectoCuerpo[k].y = 2.0;
		this->traslacionPiernaRespectoCuerpo[k].z = 1.0;
		this->direccionAngularPierna[k].y = float(4-k);
		this->direccionAngularPierna[k].x = 0.0;
		this->direccionAngularPierna[k].z = 0.0;
	}
	this->direccionAngularPierna[4].y = 1;
	this->apartamientoPierna[4]= 360;



	this->brazo1 = new Brazo();
	this->brazo2 = new Brazo();
	this->ojo1 = new Ojo();
	this->ojo2 = new Ojo();

	this->anguloCangrejo = angulo;
	this->curva = new Recta(25.0, posicion.x, posicion.y, this->anguloCangrejo);
}

Cangrejo::~Cangrejo() {
	this->cuerpo->~CuerpoCangrejo();
	for (int i = 0 ; i < 6 ; i++)
	piernas[i]->~Pierna();
	delete(piernas);
	this->brazo1->~Brazo();
	this->brazo2->~Brazo();
	this->ojo1->~Ojo();
	this->ojo2->~Ojo();
	delete this->ojo1;
	delete this->ojo2;
	delete this->cuerpo;
	delete this->brazo1;
	delete this->brazo2;
}

void Cangrejo::render(GLuint handle, glm::mat4* matrizAuxCuerpo) {
	/// cuerpo ///
	glm::mat4 matrizAuxC = *matrizAuxCuerpo;
    matrizAuxC = glm::translate(matrizAuxC, glm::vec3(0.0f,-4.0,0.0));
    matrizAuxC = glm::rotate(matrizAuxC, 90.0f,glm::vec3(0.0f,0.0,1.0));
	matrizAuxC = glm::scale(matrizAuxC, glm::vec3(2.0f,0.70f,1.5f));
//	changeObjectColor(handle, 3.0, 2.0, 1.0);
	    this->cuerpo->render(this->handle, &matrizAuxC);


	    ////////////////////  Piernas    ////////////////////

	    ///dibujo piernas del lado derecho
//
	    for (int i = 0 ; i < 3 ; i++)
	    {
	    	glm::mat4 matrizAuxPierna = *matrizAuxCuerpo;	//matriz qe dsp vuela
//	    	changeObjectColor(this->handle, 4.0, 1.0, 1.0);
	    	matrizAuxPierna = glm::translate(matrizAuxPierna , this->traslacionPiernaRespectoCuerpo[i]);
	    	matrizAuxPierna = glm::rotate(matrizAuxPierna, this->apartamientoPiernasRespectoCuerpo[i],glm::vec3(1.0, 0.0, 0.0));
	    	 matrizAuxPierna = glm::rotate(matrizAuxPierna, this->apartamientoPierna[i],this->direccionAngularPierna[i]);
	    		    this->piernas[i]->render(handle2, &matrizAuxPierna);
	    }

	    for (int k = 3; k < 6 ; k++)
	    {
	    	glm::mat4 matrizAuxPierna = *matrizAuxCuerpo;	//matriz qe dsp vuela
//	    	changeObjectColor(this->handle, 4.0, 1.0, 1.0);
	    	matrizAuxPierna = glm::translate(matrizAuxPierna , this->traslacionPiernaRespectoCuerpo[k]);
	    	matrizAuxPierna = glm::rotate(matrizAuxPierna, this->apartamientoPiernasRespectoCuerpo[k],glm::vec3(0.0, 1.0, 1.0));
	    	 matrizAuxPierna = glm::rotate(matrizAuxPierna, this->apartamientoPierna[k],this->direccionAngularPierna[k]);
	    		    this->piernas[k]->render(handle2, &matrizAuxPierna);
	    }





//	//////////// Brazos //////////////
	        glm::mat4 matrizAuxBrazo ;
//	        changeObjectColor(this->handle, 1.30, 0, 1.2);
	        ///Brazo1///
	        matrizAuxBrazo = glm::translate(*matrizAuxCuerpo, glm::vec3(-2,2,2));
	        this->brazo1->render(handle2, &matrizAuxBrazo);

	        ///Brazo2///
	        matrizAuxBrazo = glm::translate(*matrizAuxCuerpo, glm::vec3(-2,-2,2));
	        matrizAuxBrazo = glm::rotate(matrizAuxBrazo, -180.0f, glm::vec3(0,0, 1.0));
	        this->brazo2->render(handle2, &matrizAuxBrazo);


	 //////// ojos /////////
//	        changeObjectColor(this->handle, 13, 31, 13);
	        glm::mat4 matrizAuxOjos;

	        ///Ojo1///
	        matrizAuxOjos = glm::translate(*matrizAuxCuerpo, glm::vec3(-1.5,-1.5,4.5));
	        this->ojo1->render(handleOjos, &matrizAuxOjos);

	        ///Ojo2///
	        matrizAuxOjos = glm::translate(*matrizAuxCuerpo, glm::vec3(-1.5,1.5,4.5));
	        this->ojo2->render(handleOjos, &matrizAuxOjos);


}

void Cangrejo::render(GLuint handle) { 	//aca iria una lista de los partes dibujables que tiene el cangrejo
	changeObjectColor(this->handle, 1.0, 1.0,1.0);
	glm::mat4 matrizAuxCuerpo = glm::mat4 (1.0f);	//matriz qe dsp vuela
    matrizAuxCuerpo = glm::translate(matrizAuxCuerpo, this->posicionCangrejo);
    matrizAuxCuerpo = glm::rotate(matrizAuxCuerpo, this->anguloCangrejo,this->direccionCangrejo);
	matrizAuxCuerpo = glm::scale(matrizAuxCuerpo, this->tamanoCangrejo);
    this->render(handle, &matrizAuxCuerpo);



}

void Cangrejo::setCamara(Camara* camara) {
this->cuerpo->setCamara(camara);
}

void Cangrejo::moverPiernas() {
	for (int i = 0 ; i < 6 ; i++) this->piernas[i]->rotar();
}

void Cangrejo::moverAlaDerecha() {
this->moverPiernas();
this->posicionCangrejo.y--;
this->anguloCangrejo++;
this->direccionCangrejo.x = 0.0f;
this->direccionCangrejo.y = 0.0f;
this->direccionCangrejo.z = 1.0f;
}

void Cangrejo::moverPiernasIzquierdas() {

}

void Cangrejo::setearPasoInicial(float float1) {
	this->curva->setearCantPasosInicial(float1);
}

void Cangrejo::setCam(Camara* cam, glm::mat4 pr) {
	this->cuerpo->setCam(cam, pr);
	this->piernas[0]->setCam(cam,pr);
	this->piernas[1]->setCam(cam,pr);
	this->piernas[2]->setCam(cam,pr);
	this->piernas[3]->setCam(cam,pr);
	this->piernas[4]->setCam(cam,pr);
	this->piernas[5]->setCam(cam,pr);
	this->brazo1->setCam(cam,pr);
	this->brazo2->setCam(cam,pr);
	this->ojo1->setCam(cam,pr);
	this->ojo2->setCam(cam,pr);
}

void Cangrejo::setHandle2(GLuint handle) {
		this->handle2 = handle;
}

/// funciones auxiliares ////

void Cangrejo::changeObjectColor(GLuint handle, float r, float g, float b)
 {
     glm::vec3 diffuse_reflectivity = glm::vec3( r, g, b );

     GLuint location_diffuse_reflectivity = glGetUniformLocation( handle, "Kd");
     if( location_diffuse_reflectivity >= 0 )
 	{
 		glUniform3fv( location_diffuse_reflectivity, 1, &diffuse_reflectivity[0]);
 	}
}

void Cangrejo::moverAlaIzquierda() {
	this->moverPiernas();
	this->curva->calcularPosicion(&this->posicionCangrejo.x, &this->posicionCangrejo.y);
//	this->curva->calcularNormal(this->posicionCangrejo.x, this->posicionCangrejo.y, &this->direccionCangrejo.x,&this->direccionCangrejo.y);
//	this->anguloCangrejo = this->anguloCangrejo + 0.57;
	this->curva->calcularAngulo(&this->anguloCangrejo);
	this->direccionCangrejo.x = 0.0f;
	this->direccionCangrejo.y = 0.0f;
	this->direccionCangrejo.z = 1.0f;
}

void Cangrejo::setFixtureId(int int1, int piernas,int ojos, int normalID) {
	this->cuerpo->setFixtureId(int1);
	this->cuerpo->setFixtureNormalId(normalID);
	this->piernas[0]->setTextureId(piernas);
	this->piernas[1]->setTextureId(piernas);
	this->piernas[2]->setTextureId(piernas);
	this->piernas[3]->setTextureId(piernas);
	this->piernas[4]->setTextureId(piernas);
	this->piernas[5]->setTextureId(piernas);
	this->brazo1->setFixtureId(piernas);
	this->brazo2->setFixtureId(piernas);
	this->ojo1->setTextureId(piernas, ojos);
	this->ojo2->setTextureId(piernas, ojos);


}
